package ChiselSoc

import chisel3._
import ChiselSoc.ImemPortIo.WORD_LEN
import chisel3.util._

class Core extends Module {

  //定义一个接口与imem方向相反的信号，还有一个exit信号
  val io = IO(new Bundle{
    val imem = Flipped(new ImemPortIo())
    //  等同于
    //  val addr = Output(UInt(WORD_LEN.W))
    //  val inst = Input(UInt(WORD_LEN.W))
    val exit = Output(Bool())           //测试信号
  })

  //定义32位通用寄存器

  val regfile = Mem(32, UInt(WORD_LEN.W))

  //定义取值pc_reg寄存器，每个时钟上升沿加4

  val pc_reg = RegInit(0.U(32.W))
  pc_reg := pc_reg + 4.U(WORD_LEN.W)

  //将pc_reg寄存器的值作为地址传给memory

  io.imem.addr := pc_reg

  //暂时只是把mem里的inst拿进肚子里,这种中间的wire,在chisel里就会被优化掉,最后生成的结果是直接input做个判断然后就连去io_exit

  //在Core中拿到mem的指令
  val inst = io.imem.inst

  ////////////////////////  debug  //////////////////////

  io.exit := (inst === 0x00000006.U(WORD_LEN.W))  //出现这个指令时，exit拉高，表示测试通过
  printf(p"pc_reg : 0x${Hexadecimal(pc_reg)}\n")
  printf(p"inst   : 0x${Hexadecimal(inst)}\n")
  printf("----------\n")


}

object CoreMain extends App {
  println("Generating the adder hardware")
  emitVerilog(new Core(), Array("--target-dir", "generated/ChiselSoc/Core"))
}
